home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / delphi.swg / 0171_Interface into the wizunzip dll.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-08-30  |  18.1 KB  |  375 lines

  1.  
  2. { SEE BELOW FOR ENTIRE PROJECT USING THIS INTERFACE }
  3. (* DLL can be found at: http://quest.jpl.nasa.gov/Info-ZIP/             *)
  4.  
  5. UNIT WizUnZip;
  6.  
  7. (*                                                                      *)
  8. (* AUTHOR: Michael G. Slack                    DATE WRITTEN: 05/17/1996 *)
  9. (* ENVIRONMENT: Borland Pascal V7.0+/Delphi V1.02+                      *)
  10. (*                                                                      *)
  11. (* Unit that defines the interface into the wizunzip dll.               *)
  12. (* NOTE: File names are case-sensitive.                                 *)
  13. (*                                                                      *)
  14. (* To use:                                                              *)
  15. (*  VAR _DCL  : PDCL;                                                   *)
  16. (*      Fils  : PACHAR; {pointer to array or pchars}                    *)
  17. (*      ZipFn : ARRAY[0..144] OF CHAR;                                  *)
  18. (*      FilNm : ARRAY[0..xx] OF CHAR;                                   *)
  19. (*    { TT    : THANDLE; }                                              *)
  20. (*       ...                                                            *)
  21. (*  StrCopy(FilNm,'case sensitive file name (could incl wildcards)');   *)
  22. (*  GetMem(Fils,SizeOf(PCHAR)); {only allocating for single file}       *)
  23. (*   {or}                                                               *)
  24. (*   {should use this method in Delphi - seems to prevent GPFs}         *)
  25. (*   { TT := GlobalAlloc(GHnd,SizeOf(PCHAR)); }                         *)
  26. (*   { Fils := GlobalLock(TT); }                                        *)
  27. (*  Fils^[0] := @FilNm;                                                 *)
  28. (*  StrCopy(ZipFn,'C:\UNZIP52.ZIP');                                    *)
  29. (*  WZInitADCL(_DCL,HInstance,MWnd,LWnd); {create/initialize struct}    *)
  30. (*  WITH _DCL^ DO                                                       *)
  31. (*   BEGIN {setup rest of parameters for unzip}                         *)
  32. (*    WITH lpUMB^ DO                                                    *)
  33. (*     StrCopy(szUnzipToDirName,'some dir'); {only dir that is used}    *)
  34. (*    {set flags wanted (all set to false from init)}                   *)
  35. (*    OverWrite := TRUE; {example}                                      *)
  36. (*    ArgC := 1; {set equal to number of files submitting}              *)
  37. (*    lpszZipFN := @ZipFn;                                              *)
  38. (*    FNV := Fils;                                                      *)
  39. (*   END; {with}                                                        *)
  40. (*  I := WZ_UnZip(_DCL); {run unzip proc}                               *)
  41. (*  WZDestroyDCL(_DCL); {release control block}                         *)
  42. (*  FreeMem(Fils,SizeOf(PCHAR)); {free file list}                       *)
  43. (*   {or}                                                               *)
  44. (*   { GlobalUnlock(TT); }                                              *)
  45. (*   { GlobalFree(TT); }                                                *)
  46. (*  IF I <> wze_OK THEN {problem with unzip};                           *)
  47. (*                                                                      *)
  48. (* -------------------------------------------------------------------- *)
  49. (*                                                                      *)
  50. (* REVISED: 07/30/1996 - Per suggestions from Brad Clarke               *)
  51. (*                       (bclarke@cyberus.ca), added listing constants  *)
  52. (*                       and changed nzFlag to integer.                 *)
  53. (*                                                                      *)
  54.  
  55. INTERFACE
  56.  
  57.  USES WinTypes, WinProcs, CommDlg;
  58.  
  59.  CONST LibName = 'wizunz16';
  60.        wzl_WizUnzip_Max_Path  = 127; {128}
  61.        wzl_Options_Buffer_Len = 255; {256}
  62.        wzl_None               = 0;   {no listing}
  63.        wzl_Short              = 1;   {short listing}
  64.        wzl_Long               = 2;   {long listing}
  65.        wze_OK                 = 0;
  66.        wze_Warning            = 1;
  67.        wze_Err                = 2;
  68.        wze_BadErr             = 3;
  69.        wze_Mem                = 4;
  70.        wze_Mem2               = 5;
  71.        wze_Mem3               = 6;
  72.        wze_Mem4               = 7;
  73.        wze_Mem5               = 8;
  74.        wze_NoZip              = 9;
  75.        wze_Param              = 10;
  76.        wze_Find               = 11;
  77.        wze_Disk               = 50;
  78.        wze_EOF                = 51;
  79.  
  80.  TYPE PUMB = ^TUMB;
  81.       TUMB = RECORD
  82.               {fully qualified archive name (OEM chars)}
  83.               szFileName          : ARRAY[0..wzl_WizUnzip_Max_Path] OF CHAR;
  84.               {directory with archive (ANSI chars)}
  85.               szDirName           : ARRAY[0..wzl_WizUnzip_Max_Path] OF CHAR;
  86.               {extraction directory "unzip to" (ANSI chars)}
  87.               szUnzipToDirName    : ARRAY[0..wzl_WizUnzip_Max_Path] OF CHAR;
  88.               {temp extraction dir "unzip to" (ANSI chars)}
  89.               szUnzipToDirNameTmp : ARRAY[0..wzl_WizUnzip_Max_Path] OF CHAR;
  90.               {extraction directory "unzip from" (ANSI chars)}
  91.               szUnzipFromDirName  : ARRAY[0..wzl_WizUnzip_Max_Path] OF CHAR;
  92.               {text for totals of zip archive}
  93.               szTotalsLine        : ARRAY[0..79] OF CHAR;
  94.               {scratch buffer}
  95.               szBuffer            : ARRAY[0..wzl_Options_Buffer_Len] OF CHAR;
  96.               {wave file name for sound}
  97.               szSoundName         : ARRAY[0..wzl_WizUnzip_Max_Path] OF CHAR;
  98.               {password for encrypted files}
  99.               szPassword          : ARRAY[0..80] OF CHAR;
  100.               {pointer to szpassword}
  101.               lpPassword          : PCHAR;
  102.               {archive open file name struct (commdlg)}
  103.               ofn                 : TOPENFILENAME;
  104.               {wave file open file name struct (commdlg)}
  105.               wofn                : TOPENFILENAME;
  106.               {???}
  107.               msg                 : TMSG;
  108.               {archive open file struct}
  109.               _of                 : TOFSTRUCT;
  110.               {wave file open file struct}
  111.               wof                 : TOFSTRUCT;
  112.              END;
  113.       TDLLPRNT = FUNCTION{(VAR F : FILE; Len : WORD; S : PCHAR)} : WORD; {CEDCL;}
  114.       TDLLSND  = PROCEDURE; {CEDCL;}
  115.       PACHAR   = ^TACHAR;
  116.       TACHAR   = ARRAY[0..8187] OF PCHAR;
  117.       PDCL = ^TDCL;
  118.       TDCL = RECORD
  119.               PrintFunc         : TDLLPRNT; {ptr to appl print routine}
  120.               SoundProc         : TDLLSND;  {prt to appl sound routine}
  121.               StdOut            : POINTER;  {stdout/ptr to C FILE struct}
  122.               lpUMB             : PUMB;
  123.               hWndList          : HWND;     {list box to disp zip contents in}
  124.               hWndMain          : HWND;     {appl main window}
  125.               hInst             : THANDLE;  {appl instance}
  126.               ExtractOnlyNewer  : BOOL;     {true = extract only newer}
  127.               OverWrite         : BOOL;     {true = always overwrite}
  128.               SpaceToUnderscore : BOOL;     {true = convert space to underscore}
  129.               PromptToOverwrite : BOOL;     {true = prompt on overwrite}
  130.               ncFlag            : BOOL;     {true = write to stdout}
  131.               ntFlag            : BOOL;     {true = test zip file}
  132.               nvFlag            : INTEGER;  {0=no list, 1=short list, 2=long list}
  133.               nuFlag            : BOOL;     {true = update extraction}
  134.               nzFlag            : BOOL;     {true = display zip file comment}
  135.               ndFlag            : BOOL;     {true = extract w/stored directories}
  136.               noFlag            : BOOL;     {true = extract all files}
  137.               naFlag            : BOOL;     {true = ascii-ebcdic/eoln translate}
  138.               ArgC              : INTEGER;  {count of files to extract}
  139.               lpszZipFN         : PCHAR;    {zip file name}
  140.               FNV               : PACHAR;   {list of files to extract}
  141.              END;
  142.  
  143. (************************************************************************)
  144.  
  145.  PROCEDURE WZInitADCL(VAR _DCL : PDCL; PInst : THANDLE; MainW, ListW : HWND);
  146.      (* procedure used to alloc and init a dcl struct with zeros *)
  147.  
  148.  PROCEDURE WZDestroyDCL(VAR _DCL : PDCL);
  149.      (* procedure used to free a dcl allocated by prior call to initadcl *)
  150.  
  151.  FUNCTION  WZDummyPrint{(VAR FH : INTEGER; Len : WORD; S : PCHAR)} : WORD; {CEDCL;}
  152.      (* procedure that can be used as a dummy print routine for dll *)
  153.      (* - C call back, parameters ignored in dummy                  *)
  154.  
  155.  PROCEDURE WZDummySound; {CEDCL;}
  156.      (* procedure that can be used as a dummy sound routine for the dll *)
  157.  
  158.  FUNCTION  WZRetErrorString(ErrC : INTEGER) : STRING;
  159.      (* function used to return error as a string *)
  160.  
  161.  FUNCTION  WZ_UnZip(_DCL : PDCL) : INTEGER;
  162.      (* wrapper function to handle switching to choosen unzip to directory *)
  163.  
  164.  (* dll functions ----------------------------------------------------- *)
  165.  FUNCTION  DLLProcessZipFiles(_DCL : PDCL) : INTEGER;
  166.      (* function to run the unzip routine *)
  167.  
  168.  PROCEDURE GetDLLVersion(VAR Ver : LONGINT);
  169.      (* procedure to return the current dll version of wizunzip *)
  170.      (*   hiword(ver) = major . loword(ver) = minor             *)
  171.  
  172. (************************************************************************)
  173.  
  174. IMPLEMENTATION
  175.  
  176. {$IFDEF VER80}
  177.  USES SysUtils;
  178. {$ELSE}
  179.  USES Strings;
  180. {$ENDIF}
  181.  
  182. (************************************************************************)
  183.  
  184.  PROCEDURE WZInitADCL(VAR _DCL : PDCL; PInst : THANDLE; MainW, ListW : HWND);
  185.  
  186.   BEGIN (*wzinitadcl*)
  187.    GetMem(_DCL,SizeOf(TDCL));
  188.    FillChar(_DCL^,SizeOf(TDCL),0);
  189.    _DCL^.PrintFunc := WZDummyPrint;
  190.    _DCL^.SoundProc := WZDummySound;
  191.    GetMem(_DCL^.lpUMB,SizeOf(TUMB));
  192.    FillChar(_DCL^.lpUMB^,SizeOf(TUMB),0);
  193.    _DCL^.lpUMB^.lpPassword := @_DCL^.lpUMB^.szPassword;
  194.    _DCL^.hWndMain := MainW;
  195.    _DCL^.hWndList := ListW;
  196.    _DCL^.hInst    := PInst;
  197.   END; (*wzinitadcl*)
  198.  
  199. (************************************************************************)
  200.  
  201.  PROCEDURE WZDestroyDCL(VAR _DCL : PDCL);
  202.  
  203.   BEGIN (*wzdestroydcl*)
  204.    IF _DCL = NIL THEN Exit;
  205.    FreeMem(_DCL^.lpUMB,SizeOf(TUMB));
  206.    FreeMem(_DCL,SizeOf(TDCL));
  207.    _DCL := NIL;
  208.   END; (*wzdestroydcl*)
  209.  
  210. (************************************************************************)
  211.  
  212.  FUNCTION WZDummyPrint{(VAR F : FILE; Len : WORD; S : PCHAR)} : WORD;
  213.     VAR Len : WORD;
  214.   BEGIN (*wzdummyprint*)
  215.    ASM
  216.     MOV AX,[BP+8] {pass back len as return}
  217.    END;
  218.   END; (*wzdummyprint*)
  219.  
  220. (************************************************************************)
  221.  
  222.  PROCEDURE WZDummySound;
  223.     VAR I : INTEGER;
  224.   BEGIN (*wzdummysound*)
  225.    {do nothing}
  226.    I := 1; {so that optimizations do not remove proc}
  227.   END; (*wzdummysound*)
  228.  
  229. (************************************************************************)
  230.  
  231.  FUNCTION WZRetErrorString(ErrC : INTEGER) : STRING;
  232.  
  233.     VAR T : STRING[80];
  234.         N : STRING[5];
  235.  
  236.   BEGIN (*wzreterrorstring*)
  237.    T := '';
  238.    CASE ErrC OF
  239.     wze_OK      : ;
  240.     wze_Warning : T := 'Warning, zip may have error!';
  241.     wze_Err     : T := 'Error in zipfile!';
  242.     wze_BadErr  : T := 'Critical error in zipfile!';
  243.     wze_Mem     : T := 'Insufficient memory!';
  244.     wze_Mem2    : T := 'Insufficient memory (2)!';
  245.     wze_Mem3    : T := 'Insufficient memory (3)!';
  246.     wze_Mem4    : T := 'Insufficient memory (4)!';
  247.     wze_Mem5    : T := 'Insufficient memory (5)!';
  248.     wze_NoZip   : T := 'Not a zip file/zip file not found!';
  249.     wze_Param   : T := 'Invalid parameters specified!';
  250.     wze_Find    : T := 'No files found!';
  251.     wze_Disk    : T := 'Disk full error!';
  252.     wze_EOF     : T := 'Unexpected EOF encountered!';
  253.     ELSE BEGIN {other error}
  254.           Str(ErrC,N);
  255.           T := 'Other error during zip operation - Error code = '+N;
  256.          END; {else}
  257.    END; {case}
  258.    WZRetErrorString := T;
  259.   END; (*wzreterrorstring*)
  260.  
  261. (************************************************************************)
  262.  
  263.  FUNCTION WZ_UnZip(_DCL : PDCL) : INTEGER;
  264.     VAR S1, S2 : STRING[144];
  265.         W      : WORD;
  266.   BEGIN (*wz_unzip*)
  267.    W := SetErrorMode($8001); S1 := '';
  268.    GetDir(0,S1); S2 := StrPas(_DCL^.lpUMB^.szUnzipToDirName);
  269.    IF S2[Length(S2)] = '\'
  270.     THEN BEGIN {remove '\'?}
  271.           IF (Length(S2) > 1) AND (S2[Length(S2)-1] <> ':')
  272.            THEN Delete(S2,Length(S2),1); {not 'c:\'}
  273.           IF Length(S2) = 1 THEN S2 := '';
  274.          END; {then}
  275.    IF S2 <> ''
  276.     THEN {$I-} ChDir(S2) {$I+}
  277.    ELSE S1 := '';
  278.    IF IOResult <> 0
  279.     THEN BEGIN {error in ch dir}
  280.           MessageBeep(mb_OK);
  281.           MessageBox(_DCL^.hWndMain,'Could not set "unzip-to" directory!',NIL,
  282.                      mb_OK OR mb_IconStop);
  283.           S1 := '';
  284.          END; {then}
  285.    SetErrorMode(W);
  286.    WZ_UnZip := DLLProcessZipFiles(_DCL);
  287.    IF S1 <> '' THEN ChDir(S1);
  288.   END; (*wz_unzip*)
  289.  
  290. (************************************************************************)
  291.  
  292.  FUNCTION DLLProcessZipFiles(_DCL : PDCL) : INTEGER;
  293.   EXTERNAL LibName INDEX 1;
  294.  
  295.  PROCEDURE GetDLLVersion(VAR Ver : LONGINT);
  296.   EXTERNAL LibName INDEX 3;
  297.  
  298. (************************************************************************)
  299.  
  300. END. (*of unit*)
  301.  
  302. { Cut this out to a file :  Name it TESTDLL.XX and use XX3402 to decode }
  303. { TESTDLL.ZIP will be created }
  304.  
  305.  
  306. *XX3402-003539-250896--72--85-21555-----TESTDLL.ZIP--1-OF--1
  307. I2g1--E++++6+1lSlW-H15rKQU2++7w1+++A++++JItOLpF3IpEiF3B9bJ9jHw6k2DqyNDw8
  308. OOT6Nf6DC30K+0tiC6IFIpa3maWLIY9wvyoDlWOFFDlohrhjvxvpPXN0V8O2takzhuq+MmGk
  309. 1qrfaKn7Su5HK8UOg8oVzV+e7elI6GKtKDYiYCY+YyJ8y3vPhalf3b3KMWuyEfchwI6kTd4m
  310. puaYcSgSdOx+Fqhr0v8Y4ol3V+cg-8uZERLvIzMQ6MeKiB5Mc0YGWxLdh+OuYlzfYV2eTgQ1
  311. J-HGvq7x-aOPYZ5dOri8X3Wy8v+iglqJYxWK8E2ziApuzK2o09DcuT2Vnd7yb4GHwHGAob1Q
  312. WfdlFMIBuaEQ7b4KVZBBP98Qgs7j8abpcWTPuiTYA84l+vL7SwMrE3dIoKn3p4gqyBgGcPc-
  313. hIPcL3RvP5hSjQQPJzqBxwT505OQmrRHBOKW6eUGO5fVjSAvqcx4txL+WWNzrn9yccUaTJKd
  314. R1+YJDhHhU7K5+PGefI+z7S+Ikgs3kjc4qnQkybtzI0y+J-9+kEI++++0++PMwMUYSZmW+k0
  315. ++1w+k++1++++3JCKYZEJoZC9YF4HMKGnqvHE-14BnOl5HgBEHk+tV7-1ZLHLbfVE28WFadf
  316. en2exBFhD4ZKrSlOuorXc1k+Xk7jkbBktcMskzdD2XSWQD5gf1rTxxArzaqXMC-Rb5LEETC5
  317. XZ1U1kuAMA13f3DBbYxCMG9pPoUDS8HVuWI7tJFjOwM7YBidp3xIn-uC7C5Ag8x6t+MEGl1q
  318. U1CtryCI0vAyddS2VLkFE08Rv2IyezqgNRotbc3VX7NeQ7MDXiGGUcDqT76+XLoEEnOSOhS4
  319. loNHjX0h30kxqOZY6RN2Nh0RGwaNaNSQL9Amw4MCfbogi9KL4ylOmsi+iEfS0j0B7o6E4X6x
  320. peBYT4TK0v4gEvgSVqKDswQxbBNvxYaZAm+In1v1BlF0OqhLqPIvz9jRIRbiyb4vOfyJ29bJ
  321. prPpXkdx8nUZgSnml0de2JdI1YrzKZZjyngePxMQomv3svg5GzpJKefHsrB-E9Xbg5WkqQOE
  322. GPUJaCN1BLicRZw6B4kT0q+mzPuIYMuE2uGPSYQktPTCxhUlJ8kGVD5aecUsRZypxpLSfpRN
  323. KTIzxBAPG00xIKLpZh9hZyrohapuKLWloy0H2l90-S1EMrHtZ2xw98RbwpXq2tKGuhD7HMye
  324. +N2IX9rpPtE7ZnOZToMdykXTEw4yDKvMbzy9u-aTSDQU3c76w+KTFT6zX4iaSifYHdGg8rYN
  325. uMh0Ebw+I2g1--E++++6+A7dlW+8jsNkq++++2Y-+++A++++JItOLpF3IpEiHp-IHMrBHgAk
  326. 26HjZjki--+e6-yUcO8We85VJmo5squOJFDPQak7wTFsT659O9uNLQpqvYPD+sJD8KtI7QKh
  327. Cd4WVZj+9S2S60h6+rZ0gM4ok4Ss3vVLi1T6Cz+16gJqlTNM-VupLyEh500vHJp5+IQpTOL1
  328. obMCpRd55ja5vfv9NFipCPONJLJlBXiLsduo9nmf9Yz9EAq-H5G-OQcfulFxWXZHyNZoA5qX
  329. MuzApKtDUyxttsAvHBRzb0n5znn3Y2lCd7UviyT6nidVIaKeoI4D30ZUONBgMLGzI2g1--E+
  330. +++6+A3dlW+wkkvzaE+++Aw++++A++++JItOLpF3IpEiF3-G8mX8Hmx8n3I6nMi81oYh9f5a
  331. tS9Z8WpC9SPZIZ-kmmz89RM-gM1GaELVaLY8E8ESuVTZ4F1iuOQLs-WgfZ+BIaJM0xNMfF8Y
  332. c8ILt-dQ0y6ZdONbtc3oClMIt4Ea7tNYtiTdVKGKt8EeKBYee+BBJ+-NaJeYPcqimfYcBP2Y
  333. 3KGmFUXMT-qkMkkpAJE4ZSM-lJ9nIjF+JU6+I2g1--E++++6+A7dlW+MwyXnH+2++-c1+++A
  334. ++++JItOLpF3IpEiIYJHdNCzHgAk26QjHRJaW2U5RX6mgdIB20kR88z+pcuF8V3jK26WTUkS
  335. lExUtFYuAYFFdcOVsfVnvHG-PdnpQznR5nil9VU0-X0PTMs+9U2U7RqG+VW1hF4QBCYauFPG
  336. UROO5V8ErHGVKu+1N2TIegp4hCeeLOqtbbUyjqtJRiHzl7IrmOmUmBYwWnxlI4UnQZjD4mcI
  337. LRly9Xa8LAWRS1wkCz6WKFJe1RuVgdr66dx+1UfHgSjimbPWNH87V2yEew9aDLSLCbtUul-A
  338. FQDoiGefegCsf4dHaluPojHmsv9YX4Axgx2xBZJR5V3WAkXHUTKE8E243jRqDpHwsY4tgmp+
  339. QYcI0fqcPheEPoyWXdaW1hukUE1rckzQ7kpyQnjdw01NYtuG2gHh-K71yfd-z0MVulLNni1l
  340. Pf3Qr1wheTDDvHg3BB7oNjiSzsI+TU-EGkA23+++U+U+gPIJ6SRvU66e-E++5Es+++k+++-J
  341. HZd7I3R7HWtEEJCpJypjqXUMzpudzwDnsGFUZuLEHOQHL8RFG2co-UXGeoOjJtZUk7ilAxjd
  342. 0pLzxvCREA99fHjR3cb4TZtyTjmwdUYX0WvNaAFLV1KCXsuDmezUVnmj8VMfl39-DK3HTUwn
  343. 9c+kVQIAFRWgiCOg2fOezSNC8ML76uW3MQnsulK7MGts2fgtJfjPVEUla4+BZP+d63K5VJ7l
  344. zSHYOu6DQXz5p4J66bTCvos0UnAC-WS5vDcVXw2uDhdQmKkGWSLl2Q1cIJseEeI1qf5VMsnH
  345. pI1kG8wyMWbFrB-O32Zd3VQ0lEhWa0rCZC-OpS1sL0kpfIoEtLCx48ZdGsYIRrL7h7hgp7Ey
  346. kMW5Ffs4Nl+Nr99RJUk1s1lFWfBO5Q7opGWGHkyHrymGioGeQztUI97ZliX5a8J44ZuymxUX
  347. R6RnRfv9q93q0tsa+hjvXVPwjXn0P6e3kNdwld4ev2ZaxqZF2brtLibHzmHxtVjGgG-rGC3I
  348. wEY4uFOaK1hS62IsYz-g-NC7Fhb6qRo-ALq41SER2iik4ozNhqKENInl2XBZhEnZuNQVj59P
  349. zgRbgwiBHtLQPrZmUiR2Mo+LnlHInu-KPI16sqltT9GqNUzoCtmiPk-X2jgAuh+Q1diTfeii
  350. KrjvxUPuDfEunK5aPTrQhZhRo461zQudUTpPVu+LSVTSg4-is-TnnDISQ7GYAEUvLUzCjMiU
  351. hs5Nt8cP89mIPchW7D7HM8H2cALXlv6ppWY0ysHW5ZfWGY5wOVkkcdfOof6lqyY2H0f26ilo
  352. 27hGv4mCGzRPiY5MgNTx4xfxb7kO12wGemE4MHcZbo4AV1tOMG3hkolAXMDWE1LyQo2NO0lL
  353. ljOS0RhvSsj0aE1gneRcPdXr8rcvKb0V4jckwvNUVAq9S3ujfRbrF0o8pA0cLspjvMWk3uxc
  354. 6N4kn0uH6+Ller3Pro9klvKPWZvEoRgB0IyMUbRE9NVl877fRuIpv5cAHGWS4hD0sOKrRSbx
  355. m+RgWVyAP5JDI3wt7rbRYLTc09yd4PaeQRC9-T9BDaA8l0TIUP0aTuREVp2s15cLilI+SrKE
  356. YLmzm5uVljF7AVQSB9StOO3y7pFOfVicfO6Bku7BMOTNOrSxEiZeAsknRl7Ud+FVQrax5v0P
  357. FetYexFsvDFrdsjNL0rAfZ7dKCyR4P34LguyvsGbphJyTtUaQ2p5+17BnQi8AD0pzbJk+qRE
  358. CWaZWNQGh2fdft8-04hasnocUG8pPUjZ1BxWNuCwHSTZYdr5w-d8jyfE9ZK9glYFGxikbSjZ
  359. dASRtSEHZXRCBRLrBQETvq+dB12xrrgUmf+8wr9HXKmypn93cg1-DUVDQusUFZjZzAENTEF2
  360. 8MyEeLzPMOFSI+knTIl-J+RIbrR-yEHFdZ2cLrHMp-aF3SvDmUCH4NJWRRgwqqVoSTGZ56Mu
  361. FBgGTpxLfLjTyztDPAJJouEWUN507oG9OWlhBYUZYeXMEzxrLxvellOBldQTnrTU0VSIuHRP
  362. mBh2a4gtVREOu3WJ1kJymww+zHggfUFFy4+1P6dtmyNwkps+wBQ2IHAzK98QM43iMW6hEGOH
  363. 7J4vIy13eS9rzgleHVPdDqZuU-P530C76IczWq30STGZc7Iar0KXatEnWHsHC2rdrPaNWjiO
  364. jNiTur8wLy5PzcTRYPFTtnB2n6UktLsp5a9Z0Q33qh58EQJNdUFHyDoDdiFrFgoyc2mWG-B9
  365. KhLwvp9c50b+xV007vL+vDb3KTHjLv5frhmWLC90IBBjpvnz+J-9+E6I+-E++++6+1lSlW-H
  366. 15rKQU2++7w1+++A++++++++++2+6+++++++++-JHZdTJ2JHJ0t2IohEGk203++I++++0++P
  367. MwMUYSZmW+k0++1w+k++1++++++++++-+0++++0Q+E++JItOGJ-LGIsiF2NBI2g-+VE+3+++
  368. ++U+kab46+ezVb1M++++GE2+++k++++++++++E+U++++oUA++3JCKZxIFJBI9YxEJ3-9+E6I
  369. +-E++++6+A3dlW+wkkvzaE+++Aw++++A++++++++++2+6++++BE2++-JHZdTJ2JHJ0t2I37E
  370. Gk203++I++++0+10OQMU4DDcwok-+++O+k++1++++++++++++0++++0L-E++JItOLpF3IpEi
  371. IYJHI2g-+VE+3+++++U+gPIJ6SRvU66e-E++5Es+++k++++++++++E+U++++1EQ++3JCKYZE
  372. JoZC9Z--Ip-9-EM+++++-U+4+3k-++-V1+++++++
  373. ***** END OF BLOCK 1 *****
  374.  
  375.